/*
 * robot.cpp
 *
 *  Created on: Oct 16, 2013
 *      Author: m
 */

#include <iostream>
#include <cstdlib>
#include <ctime>
#include "DefinicionesComunes.h"
#include "NewMessageQueue.h"
#include "NewSemaphore.h"
#include "NewSharedMemory.h"
#include "Sequence.h"
#include "CPrinter.h"

using namespace ipc;

int main( int argc, char* argv[] )
{
    int idVuelo;

    srand (time(NULL));

    /*
     * Obtengo el ID
     */
    idVuelo = Sequence::get( IPC_BASE_FILE, SEQ_ID_ROBOT ).getNext();

    /*
     * Configuro el CPrinter
     */
    CPrinter::setHeader( "ROBOT", idVuelo );

    // IPCs
    MessageQueue<MensajeEquipaje> cintaEquipajeVerificado =
            MessageQueue<MensajeEquipaje>::get( IPC_BASE_FILE, MQ_VERIFICADO );
    MessageQueue<int> mqNotificacionEquipaje =
            MessageQueue<int>::get( IPC_BASE_FILE, MQ_NOTIFICACIONES );
    SharedMemory<int> shmContadorEquipaje =
            SharedMemory<int>::get( IPC_BASE_FILE, SHM_CONT_EQUIPAJE );
    Semaphore mutexContadorEquipaje =
            Semaphore::get( IPC_BASE_FILE, MUTEX_CONT_EQUIPAJE );

    CPrinter::printOut( "INICIADO" );

    while( true )
    {
        MensajeEquipaje equipaje;

        equipaje = cintaEquipajeVerificado.get( idVuelo );

        CPrinter::printOut( "Cargando equipaje" );

        sleep( random() % 5 );

        mutexContadorEquipaje.p( idVuelo - 1 );

        int equipajeRestante = shmContadorEquipaje.read( idVuelo - 1 );

        equipajeRestante--;

        shmContadorEquipaje.write( equipajeRestante, idVuelo - 1 );

        mutexContadorEquipaje.v( idVuelo - 1 );

        //if ( equipajeRestante == 0 )
        //{
            mqNotificacionEquipaje.put( MTYPE_NOTIFICACIONES, idVuelo );
        //}
    }

    return 0;
}
